package com.example.demo.design.template_method;

/**
 * @Author: liull
 * @Description: 请客 AbstractClass（抽象类）：在抽象类中定义了一系列基本操作(PrimitiveOperations)，这些基 本操作可以是具体的，也可以是抽象的 ，每一个基本操作对应算法的一个步骤，在其子类中
 *               可以重定义或实现这些步骤。同时，在抽象类中实现了一个模板方法(Template Method)，用于 定义一个算法的框架，模板方法不仅可以调用在抽象类中实现的基本方法，也可以调用在抽 象类的子类中实现的基本方法，还可以调用其他对象中的方法。
 * @Date: Created in 22:18 2020/11/11
 * @Modified By:
 */
public abstract class Treat {
    /** 点菜 ,具体方法，点菜流程都差不多，服务员过来登记 */
    public void order() {
        System.out.println("叫服务员过来，然后点餐");
    }

    /** 买单，具体方法，买单流程也大同小异 */
    public void payBill() {
        System.out.println("叫服务员过来，然后买单");
    }

    /** 抽象方法 吃东西，吃东西多种多样，可丰盛，可节俭，具体看你的预算 *****/
    public abstract void eat();

    /** 定义模板方法 请客的基本步骤包含 点单 吃饭 买单 ，其中买单视具体的子类实现而定（），点单买单为具体的方法 */
    public void treat() {
        // 1.点单
        order();
        // 2.吃饭
        eat();
        // 3.结账
        payBill();
    }
}
